/**
 * 文件名：@DatabasePropertiesLoader.java <br/>
 * 包名：cn.efunbox.afw.core.environment <br/>
 * 项目名：afw-core <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.core.environment;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 类名：DatabasePropertiesLoader  <br />
 *
 * 功能：从数据库中加载属性信息的实现
 *
 * @author xtwin <br />
 * 创建时间：2015年12月1日 下午4:32:52  <br />
 * @version 2015年12月1日
 */
public class DatabasePropertiesLoader implements PropertiesLoader {
	
	// 日志记录器
	private static final Log logger = LogFactory.getLog(DatabasePropertiesLoader.class);
	
	// jdbc url
	protected String url;
	
	// 数据库用户名
	protected String username;
	
	// 数据库密码
	protected String password;
	
	// 数据库驱动
	protected String driver;
	
	// 加载sql
	protected String sql;

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月1日 下午4:33:02<br/>
	 * 
	 * @return <br/>
	 * @see cn.efunbox.afw.core.environment.PropertiesLoader#load()
	 */
	@Override
	public Properties load() throws Exception {
		Properties props = new Properties();
		Connection conn = null;
		try {
			conn = getConnection();
			ResultSet rowSet = conn.createStatement().executeQuery(sql);
			while (rowSet.next()) {
				String key = rowSet.getString(1);
				String value = rowSet.getString(2);
				if (null != key) {
					if (value == null) {
						value = "";
					}
					props.put(key, value);
				}
			}
		} finally {
			if (null != conn) {
				try {
					conn.close();
				} catch (Exception e) {
					logger.warn("release connection is error : " + e.getMessage(), e);
				}
			}
		}
		if (logger.isDebugEnabled()) {
			logger.debug("place holder arguments : " + props);
		}
		logger.debug("released database connect .");
		return props;
	}

	/**
	 * 
	 * 功能：获得数据库链接 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月1日 下午4:35:42 <br/>
	 */
	protected Connection getConnection() throws IOException {
		try {
			Class.forName(this.driver);
		} catch (Throwable t) {
			throw new IOException("Cannot load JDBC driver class '" + driver + "'");
		}
		
		try {
			return DriverManager.getConnection(url, username, password);
		} catch (SQLException e) {
			logger.error("Cannot create connection for connection URL '" + url + "'", e);
		}
		
		return null;
	}

	/**
	 * @version 2015年12月1日-下午4:39:36
	 */
	public void setUrl(String url) {
		this.url = url;
	}

	/**
	 * @version 2015年12月1日-下午4:39:36
	 */
	public void setUsername(String username) {
		this.username = username;
	}

	/**
	 * @version 2015年12月1日-下午4:39:36
	 */
	public void setPassword(String password) {
		this.password = password;
	}

	/**
	 * @version 2015年12月1日-下午4:39:36
	 */
	public void setDriver(String driver) {
		this.driver = driver;
	}

	/**
	 * @version 2015年12月1日-下午4:39:36
	 */
	public void setSql(String sql) {
		this.sql = sql;
	}
}
